from datetime import date
from langgraph.types import Command, interrupt
from langchain_community.agent_toolkits.file_management.toolkit import FileManagementToolkit
from pathlib import Path
from langchain.agents import tool
import json
from typing import Union, List
import requests
# working_directory = Path("E:/demo/langChainTest/files")
# toolkit = FileManagementToolkit(
#     root_dir=str(working_directory)
# )
# toolkit.get_tools()
# file_tool = FileManagementToolkit(
#     root_dir=str(working_directory),
#     selected_tools=["read_file", "write_file", "list_directory"],
# ).get_tools()
# read_tool, write_tool, list_tool = file_tool



# @tool(description="""
#     这是一个文件读取工具，传入文件名，可以获取该文件的内容（多个文件需要循环调用）
#     示例：read_file_tool.invoke({"file_path": "example.txt"})
# """)
# def read_file_tool (file_path: str) -> str:
#     print("read_file_tool------------------", file_path, end="------------------\n")
#     text = read_tool.run({
#         "file_path": file_path,
#     })
#     print("read_file_tool------------------", text)
#     return text


# @tool(description="""
#     这是一个文件写入工具，传入文件名和内容可以将内容写入文件，没有该文件会创建一个
#     file_path：文件名
#     text：写入内容
#     示例：write_file_tool.invoke({"file_path": "example.txt", "text": "我是写入的内容"})
# """)
# def write_file_tool (file_path: str, text: str) -> str:
#     write_tool.run({
#         "file_path": file_path,
#         "text": text,
#     })
#     return "写入成功"


# @tool(description="""
#     这是一个获取文件列表工具，直接调用可以获取文件夹内所有文件列表
#     示例：list_file_tool.invoke({})
# """)
# def list_file_tool () -> str:
#     print("list_file_tool-----------------------")
#     text = list_tool.run({
#         "file_path": ".",
#     })
#     return text


# @tool(description="""返回今天的日期，用于任何
# 与知道今天的日期有关的问题。
# 输入应该始终是空字符串，
# 此函数将始终在今天返回
# date-任何日期数学都应该发生
# 此功能之外。""")
# def time(text: str) -> str:
#     print("time------------------------", text)
#     return str(date.today())



@tool(
    description="""
        学生信息获取：可以根据学生姓名，学生班级，学生学号查询学生基础信息
        参数：
            studentNo：学生学号（非必传）
            studentName：学生姓名（非必传）
            studentClass：学生班级（非必传）可传参数：三年一班、三年二班
            studentGrade：学生年级（非必传）可传参数：1、2、3、4、5、6
            四个参数最少要传一个，传studentClass参数可以获取全班学生信息，传studentGrade参数可以获取指定年级学生信息
        返回结果：
            studentNo：学生学号
            studentName：学生姓名
            studentClass：学生班级
            studentGrade：学生年级
            studentSex：学生性别
            studentAge：学生年纪
    """,
    return_direct=True  # 直接返回结果不经过LLM处理
)
def studentInformation(studentNo: Union[str, None] = None, studentName: Union[str, None] = None, studentClass: Union[str, None] = None) -> json:
    try:
        print("正在执行【学生信息获取】...", studentClass)
        params = {
            "studentNo": studentNo,
            "studentName": studentName,
            "studentClass": studentClass
        }
        response = requests.post("http://192.168.130.114:8086/student/getStudentInfo", json=params)
        response_data = response.json()
        print("【学生信息获取】请求结果：", response_data, flush=True)
        if response_data.get("code") == 0:
            return response_data["data"]
        else:
            return f"请求失败，状态码: {response_data.get("code")}"
    except requests.exceptions.HTTPError as http_err:
        return f"HTTP 错误: {http_err}"
    except requests.exceptions.ConnectionError as conn_err:
        return f"连接错误: {conn_err}"
    except requests.exceptions.Timeout as timeout_err:
        return f"超时错误: {timeout_err}"
    except requests.exceptions.RequestException as req_err:
        return f"请求失败: {req_err}"
    except ValueError as val_err:
        return f"参数错误: {val_err}"


@tool(
    description="""
        学生总成绩查询：可以根据学生姓名，学生学号查询学生总成绩
        参数：
            studentNo：学生学号（非必传）
            studentName：学生姓名（非必传）
            两个个参数最少要传一个
        返回结果：
            studentNo：学生学号
            studentName：学生姓名
            studentScore：学生总分数
    """,
    return_direct=True  # 直接返回结果不经过LLM处理
)
def studentOverallScore(studentNo: Union[str, None] = None, studentName: Union[str, None] = None) -> json:
    try:
        print("正在执行【学生总成绩查询】...")
        params = {
            "studentNo": studentNo,
            "studentName": studentName
        }
        response = requests.post("http://192.168.130.114:8086/student/getStudentScore", json=params)
        response_data = response.json()
        # print("请求结果：", response_data.get("code"), flush=True)
        if response_data.get("code") == 0:
            return response_data["data"]
        else:
            return f"请求失败，状态码: {response_data.get("code")}"
    except requests.exceptions.HTTPError as http_err:
        return f"HTTP 错误: {http_err}"
    except requests.exceptions.ConnectionError as conn_err:
        return f"连接错误: {conn_err}"
    except requests.exceptions.Timeout as timeout_err:
        return f"超时错误: {timeout_err}"
    except requests.exceptions.RequestException as req_err:
        return f"请求失败: {req_err}"
    except ValueError as val_err:
        return f"参数错误: {val_err}"


@tool(
    description="""
        学生科目成绩获取：可以根据学生姓名、学生学号查询学生指定科目或所有科目成绩，也可以通过班级查询该班级所有学生指定科目或所有科目成绩
        参数：
            studentNo：学生学号（非必传）
            studentName：学生姓名（非必传）
            studentCourse：科目（非必传）可传参数（语文、数学、英语）
            studentClass：班级（非必传）
            studentGrade：学生年级（非必传）可传参数：1、2、3、4、5、6
            只传studentClass获取该班级所有学生所有科目成绩
            studentCourse不传获取班级所有学生所有科目成绩
            只传studentCourse时获取所有班级所有学生该科目成绩（若查询指定班级，需进行班级学生与返回结果学生对比）
            只传studentGrade获取指定年级所有学生所有科目成绩
        返回结果：
            studentNo：学生学号
            studentName：学生姓名
            studentGrade：学生年级
            studentCourse：科目
            studentCourseScore：科目分数
    """,
    return_direct=True  # 直接返回结果不经过LLM处理
)
def studentSubjectGrades(studentNo: Union[str, None] = None, studentName: Union[str, None] = None, studentCourse: Union[str, None] = None, studentClass: Union[str, None] = None) -> json:
    try:
        print("正在执行【学生科目成绩获取】...", studentCourse, studentClass, studentNo, studentName)
        params = {
            "studentNo": studentNo,
            "studentName": studentName,
            "studentCourse": studentCourse,
            "studentClass": studentClass
        }
        response = requests.post("http://192.168.130.114:8086/student/getStudentCourseScore", json=params)
        response_data = response.json()
        print("【学生科目成绩获取】请求结果：", response_data, flush=True)
        if response_data.get("code") == 0:
            return response_data["data"]
        else:
            return f"请求失败，状态码: {response_data.get("code")}"
    except requests.exceptions.HTTPError as http_err:
        return f"HTTP 错误: {http_err}"
    except requests.exceptions.ConnectionError as conn_err:
        return f"连接错误: {conn_err}"
    except requests.exceptions.Timeout as timeout_err:
        return f"超时错误: {timeout_err}"
    except requests.exceptions.RequestException as req_err:
        return f"请求失败: {req_err}"
    except ValueError as val_err:
        return f"参数错误: {val_err}"



@tool(
    description="""
        学生成绩等级获取：查询成绩范围等级
        参数：
            无
        返回结果：
            score：分数区间（返回结果字段）
            level：分数等级（返回结果字段）
    """,
    return_direct=True  # 直接返回结果不经过LLM处理
)
def studentGradeLevel() -> json:
    try:
        print("正在执行【学生科目成绩获取】...")
        params = {}
        response = requests.post("http://192.168.130.114:8086/student/getStudentScoreLevel", json=params)
        response_data = response.json()
        print("请求结果：", response_data, flush=True)
        if response_data.get("code") == 0:
            return response_data["data"]
        else:
            return f"请求失败，状态码: {response_data.get("code")}"
    except requests.exceptions.HTTPError as http_err:
        return f"HTTP 错误: {http_err}"
    except requests.exceptions.ConnectionError as conn_err:
        return f"连接错误: {conn_err}"
    except requests.exceptions.Timeout as timeout_err:
        return f"超时错误: {timeout_err}"
    except requests.exceptions.RequestException as req_err:
        return f"请求失败: {req_err}"
    except ValueError as val_err:
        return f"参数错误: {val_err}"



# print(read_file_tool.invoke("example.txt"))
query_tools = [
    # write_file_tool,
    # read_file_tool,
    # list_file_tool,
    # time,
    studentInformation,
    studentOverallScore,
    studentSubjectGrades,
    studentGradeLevel,
]